﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Data;
using System.Web.UI.WebControls;
using vudu.EnlaceDatos.SqlServer;
using vudu.Logica.Clases;
using vudu.PaginasWeb.G6Pensum;

namespace vudu.PaginasWeb.G6Pensum
{
    public partial class EliminarMateriasPensum : System.Web.UI.Page
    {
        SqlServerPensum miServer = new SqlServerPensum();
        List<Materia> materiasEliminar = new List<Materia>();
        int idEscuela;
        static int idPensum;

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                string miRol = (string)Session["rol"];
                if (miRol != "Escuela")
                    Response.Redirect("../G3AccesoSistema/InicioSistema.aspx");
                Escuela miEscuela = (Escuela)Session["Usuario"];
                nombreEscuela.Text = miEscuela.NombreEscuela;
                Session["idMiEscuela"] = "Escuela: "+miEscuela.IdEscuela;
                idEscuela = miEscuela.IdEscuela;
            }
            catch
            {
                //mensaje.Text = "Error: no se puede conectar con la base de datos";
                //mensaje.CssClass = "mensaje";
                ///mensaje.Visible = true;
            }
            if (!IsPostBack)
            {
                idPensum = (int)Session["idPensum"];
                List<Prelacion> listaMateria = new List<Prelacion>();
                listaMateria = miServer.ConsultarMateriasPensum(idEscuela, idPensum);
                GridView1.DataSource = cargarMateriaTabla(listaMateria);
                GridView1.DataBind();
            }
        }

        //Este metodo se encarga de llenar el GridView con las materias que se desean eliminar
        public DataTable cargarMateriaTabla(List<Prelacion> listaMateria)
        {
            // Generar la DataTable de la lista de materias
            DataTable table3 = new DataTable();
            //Crea las columnas de la tabla en el GridView
            table3.Columns.Add("Materia", typeof(string));
            table3.Columns.Add("Codigo", typeof(string));
            //Se recorre la lista de materias para ir asignandolas por fila
            for (int indiceDeMaterias = 0; indiceDeMaterias < listaMateria.Count; indiceDeMaterias++)
            {
                table3.Rows.Add(listaMateria[indiceDeMaterias].MiMateriaPensum.Nombre, listaMateria[indiceDeMaterias].MiMateriaPensum.Codigo);
            }
            return table3;
        }
        //Este metodo devuelve las materias que fueron seleccionadas por medio del checkbox
        public List<Materia> RecorrerGridView2()
        {
            List<Materia> listaMateriaPrelaNueva = new List<Materia>();
            //Se recorre todo el GridView por fila
            foreach (GridViewRow row in GridView1.Rows)
            {
                Materia materia = new Materia();
                //Se declara un CheckBox que buscara el identificador del checkbox por fila
                CheckBox check = row.FindControl("chkEliminar") as CheckBox;
                //Si el checkbox esta chequeado se guardan los datos de la materia en el objeto miMateria
                //y se guardan en una lista de materias
                if (check.Checked)
                {
                    materia.Nombre = row.Cells[1].Text;
                    materia.Codigo = Convert.ToInt32(row.Cells[2].Text);
                    listaMateriaPrelaNueva.Add(materia);
                }
            }
            return listaMateriaPrelaNueva;
        }

        //Este metodo se encarga de eliminar las materias seleccionadas de un pensum determinado
        public bool procesoEliminar()
        {
            bool validacionEliminar = false;
            int numeroPrelaciones;
            List<Materia> listaPrela = new List<Materia>();
            //Se recorre el GridView buscando las materias seleccionadas a eliminar
            materiasEliminar = RecorrerGridView2();
            //Se recorre la lista de materias a eliminar
            for (int indiceDeMaterias = 0; indiceDeMaterias < materiasEliminar.Count; indiceDeMaterias++)
            {
                //Lista de materias que usan la materia a eliminar como prelacion
                listaPrela = miServer.buscarMateriasUsanPrelaciones(materiasEliminar[indiceDeMaterias].Codigo, idPensum);
                //Si la lista es nula, significa que nadie usa esa materia
                if (listaPrela == null)
                {
                    //Se elimina la materia
                    miServer.eliminarMateriaPensum(materiasEliminar[indiceDeMaterias].Codigo, idPensum);
                    validacionEliminar = true;
                }
                else
                {
                    for (int indicePrela = 0; indicePrela < listaPrela.Count; indicePrela++)
                    {
                        //Si tiene prelaciones la materia entonces
                        numeroPrelaciones = miServer.numeroPrelaciones(listaPrela[indicePrela].Codigo, idPensum);
                        //Si tiene un solo registro asociado se le asigna null al campo de prelacion
                        if (numeroPrelaciones == 1)
                        {
                            miServer.quitarPrelacion(idPensum, listaPrela[indicePrela].Codigo);
                            validacionEliminar = true;
                        }
                        //Sino se elimina el registro asociado con esa materia
                        else
                        {
                            miServer.eliminarMateriaPrelacion(idPensum, listaPrela[indicePrela].Codigo, materiasEliminar[indiceDeMaterias].Codigo);
                            validacionEliminar = true;
                        }
                    }
                    miServer.eliminarMateriaPensum(materiasEliminar[indiceDeMaterias].Codigo, idPensum);
                    validacionEliminar = true;
                }
            }
            return validacionEliminar; 
        }

        //Cuando se acciona el boton se llama al metodo eliminar
        public void Eliminar_Onclick(Object sender, EventArgs e)
        {
            bool validacionEliminacion;
            validacionEliminacion = procesoEliminar();

            if (validacionEliminacion)
                ShowAlertMessage("La(s) materia(s) fueron eliminadas con exito");
            else
            {
                mensaje.Text = "Error: no se puede conectar con la base de datos";
                mensaje.CssClass = "mensaje";
                mensaje.Visible = true;
            }
           
        }

        //Para manejar los mensajes de error
        public static void ShowAlertMessage(string error)
        {

            Page page = HttpContext.Current.Handler as Page;
            if (page != null)
            {
                error = error.Replace("'", "\'");
                ScriptManager.RegisterStartupScript(page, page.GetType(), "err_msg", "alert('" + error + "');window.location='../G6Pensum/ListarPensum.aspx';", true);
            }
        }


    }
}